//
// Created by ChaoDONG on 2021-03-24.
//

/* count.c -- using standard I/O */
/* count.c -- 使用标准 I/O */

#include <stdio.h>
#include <stdlib.h> /* 提供 exit()的原型 */

int main(int argc, char *argv[])
/* argv[0]是该程序的名称。 */
{
    int ch; /* 读取文件时，储存每个字符的地方 */
    FILE *fp; /* “文件指针” */
    unsigned long count = 0;
    if (argc != 2)
    {
        printf("Usage: %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
        /* exit()函数关闭所有打开的文件并结束程序 */
    }
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    while ((ch = getc(fp)) != EOF)
        /* 为了避免读到空文件，
         * 应该使用入口条件循环（不是do while循环）进行文件输入
         * */
        /* 鉴于getc() （和其他C输入函数）的设计，
         * 程序应该在进入循环体之前先尝试读取。
         * */
    {
        putc(ch,stdout); // same as putchar(ch);
        /* 该示例不用 putchar()而要用 putc()？
         * 原因之一是为了介绍 putc()函数；
         * 原因之二是，把stdout替换成别的参数，
         * 很容易将这段程序改写成文件输出
         */
        count++;
    }
    fclose(fp);
    /* fclose(fp)函数关闭fp指定的文件，必要时刷新缓冲区。
     * 对于较正式的程序，应该检查是否成功关闭文件。
     * 如果成功关闭，fclose()函数返回0，否则返回EOF:
     if (fclose(fp) != 0)
     printf("Error in closing file %s\n", argv[1]);
     * 如果磁盘已满、移动硬盘被移除或出现I/O错误，
     * 都会导致调用fclose()函数失败
     * */
    printf("File %s has %lu characters\n", argv[1], count);
    return 0;
}
